package com.yc;

import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author zwei
 * @create 2024-07-18 15:29
 */
public class Test3_Server {
    private static Logger logger = Logger.getLogger(Test3_Server.class.getName());

    public static void main(String[] args) throws IOException {
        //方案1：直接指定一个端口
        //方案二：循环10000已上的端口  试一个空闲的端口
        //方案3：将端口配置在一个  xml文件中
        final int port = 10000;
        ServerSocket ss = null;
        for (int i = port; i < 65535; i++) {
            try {
                //完成一台时间服务  选择合适端口的工作
                ss = new ServerSocket(i);
                logger.info("端口" + i + "空闲，使用该端口");
                break;
            } catch (Exception e) {
                if (e instanceof BindException) {
                    logger.info("端口" + i + "被占用");
                }
            }
        }
        //用info级别记录  ServerSocket套接字创建成功的信息
        logger.info(ss.getInetAddress().getHostName() + "启动了，监听了端口号：" + ss.getLocalPort());
        DateFormat df = new SimpleDateFormat("yyyy年-MM月-dd日 HH:mm:ss");
        Date d = null;
        String time = null;
        while (true) {
            logger.info("服务器ServerSocket准备等待客户端连接");
            Socket s=ss.accept();   //阻塞式的方法
            logger.info("(理解阻塞式的意思)获取一个与客户端："+s.getRemoteSocketAddress()+"的连接");
            //获取s的ip地址
            logger.info("客户端的ip地址："+s.getInetAddress().getHostAddress());
            d=new Date();
            time=df.format(d);
            System.out.println(time);
            try (OutputStreamWriter oos=new OutputStreamWriter( s.getOutputStream())){
                oos.write(("现在是"+time));
                oos.flush();
            }catch (Exception e){
                e.printStackTrace();
            }
            s.close();
            logger.info("服务端断开连接");
        }
    }

}
